<?php
/*
 * Created on 2010-8-21
 * by lixilei
 */
 
class BaseModel extends spModel{
	
	var $table = "";
	/**
	 * save original table name
	 * @author nevor
	 */
	var $o_table = "";
	var $pk = "";
	// 静态变量，为了实现全局的事务控制
	static $conn = null;
	
	// 各数据表关联关系，用于联表查询
	var $linker = array();
	
	
	// 数据表分表的前缀
	var $prefix = "";
	// 数据表的分表规模
	var $table_scale = 1000000;
	
	/**
	 * 构造函数
	 * 
	 * @param $args: 参数数组，在model中用于分表处理，genConn用于判断是否要生成数据库连接（默认生成，增加"genConn"=false则不生成）
	 * 					u类的为array("user_id":xxxx, "genConn"=xxx)
	 * 					m类的为array("area_id":xxxx, "genConn"=xxx)
	 * 					z类的为array("association_id":xxxx, "genConn"=xxx)
	 */
	function __construct($args=null) {
		/*
		 * save the table name 
		 * by nevor
		 */
		$this->o_table = $this->table;
		$this->genTableName($args);
		parent::__construct($args);
    }
    
    /**
	 * 生成数据表名
	 * 
	 * @param $args: 参数数组，在model中用于分表处理，genConn用于判断是否要生成数据库连接（默认生成，增加"genConn"=false则不生成）
	 * 					u类的为array("user_id":xxxx, "genConn"=xxx)
	 * 					m类的为array("area_id":xxxx, "genConn"=xxx)
	 * 					z类的为array("association_id":xxxx, "genConn"=xxx)
	 */
    function genTableName($args){
    			
		// 生成数据表分表的真实名称
		if($this->prefix == "u"){
			$this->table = $this->prefix.((int)($args["user_id"]/$this->table_scale) + 1).$this->o_table;
		} else if($this->prefix == "m"){
			$this->table = $this->prefix.($args["area_id"]).$this->o_table;
		} else if($this->prefix == "z"){
			$this->table = $this->prefix.($args["association_id"]).$this->o_table;
		}
		
		$this->freshTableName();
    }
	
	/**
	 * 获取数据表名称
	 */
	function getTableName(){
		return $this->table;
	}
	
	/**
	 * 获取数据表主键
	 */
	function getPrimaryKey(){
		return $this->pk;
	}
	
	/**
	 * 设置数据表链接关系，可用于连表查询
	 * 
	 * @param $map 该关联关系的标识，也是读取出数据时对应表数据的键名
	 * @param $mapKey 关联的字段在本表中的字段名
	 * @param $fclass 对应数据表的model名称
	 * @param $args 关联表model的初始化参数，u类的为array("user_id":xxxx)，m类的为array("area_id":xxxx)，z类的为array("association_id":xxxx)
	 * @param $fkey 关联的字段在对应表中的字段名
	 * @param $type 关联类型，有hasone——一对一，hasmany——一对多，manytomany——多对多，默认为hasone
	 * @param $enabled 是否启用关联，true或者false，默认为true
	 * @param $midclass 多对多关系中，关联的中间表
	 * @param $sdir 关联表model的路径，写到该model的目录一级
	 */
	function setLinker($map, $mapKey, $fclass, $args, $fkey, $type="hasone",  $enabled=true, $midclass=null, $sdir=MODEL_PATH){
		$this->linker[$map] = array(
			'type' => $type,
			'map' => $map,
			'midclass' => $midclass,
			'mapkey' => $mapKey,
			'fclass' => $fclass,
			'args' => $args,
			'sdir' => $sdir,
			'fkey' => $fkey,
			'enabled' => $enabled,
		);
	}
}
?>
